import { useCommonStore } from '@/store/main'
import $mitt from '@/common/emitter'
import { Utils } from '@/common/utils.js'
import type { TableDataInitType } from '@/components/tableType'
import type { UserTypeFnParamsType, UserTypeFn, TableDataType } from '@/common/hooks/indexType'
import type { FormType } from '@/components/formTemplateType'
import type { TextareaHTMLAttributes } from 'vue'

/**
 * 页面位置导航
 * @param { string[] } positionArr
 */
export const ACCESS_LOCATION_FN = (positionArr: string[]): void => $mitt.emit('USER_POSITION', positionArr)

/**
 * @param { string } userType
 * userType = 'userTypeCN', 返回中文用户类型`普通用户-普通管理员-超级管理员`, 
 * userType = 'isAdministrator/isSuperAdministrator', 返回 Boolean(true/false), 是否普通管理员/超级管理员
 * @param { number } userTypeNum
 * userTypeNum = -1, 返回当前登录账号的用户类型
 * userTypeNum > -1, 返回当前参数对象对应的用户类型
 */
export const USER_TYPE_FN: UserTypeFn = ({
	userType = 'userTypeCN', 
	userTypeNum = -1
}: UserTypeFnParamsType = {}) => {
	let res: boolean | string = false
	const getResult = (userType: string, userTypeNum: number): boolean | void => {
		if(userTypeNum === undefined || userTypeNum === null) return res = false
		switch(userType) {
			case 'userTypeCN':
				// 返回用户类型中文名称
				res = userTypeNum === 999998 ? '普通管理员' : (userTypeNum === 999999 ? '超级管理员' : '普通用户')
				break
			case 'isAdministrator':
				// 返回布尔值：是否管理员
				res = userTypeNum === 999998 || userTypeNum === 999999
				break
			case 'isSuperAdministrator':
				// 返回布尔值：是否超级管理员
				res = userTypeNum === 999999
				break
		}
	}
	if(userTypeNum > -1) {// 返回参数对象对应的用户类型
		getResult(userType, userTypeNum)
	} else {// 返回当前登录用户对应的用户类型
		const $store = useCommonStore()
		getResult(userType, $store.userInfo.userType)
	}
	return res
}

/**
 * 表格组件默认数据配置
 */
export const tableDataInit: TableDataInitType = {
	data: [],
	total: 0,
	currentPage: 1,
	pageSize: 10,
	pageSizes: [5, 10, 20, 30, 50],
	// layout : 'total, ->, sizes, prev, pager, next, jumper',
	layout: 'total , slot , -> ,  sizes, prev, pager, next, jumper',
	background: true,
	// 表格最大高度
	tableMaxHeight: 1000,
	// 是否隐藏序号-默认不显示
	serialNumberShowFlag: false,
	// 序号宽度
	serialWidth: 70,
	// 是否显示批量操作按钮-默认显示
	multipleOperationFlag: true,
	// 是否隐藏分页-默认显示
	paginationHideFlag: false,
	// 复选框选中的数据条数
	selected: 0,
	operationConfig: {
		isShowFlag: false,
		width: 210
	},
	// 是否显示批量操作-默认不显示
	isMultipleOperationFlag: false,
	// 是否显示预览按钮-默认不显示
	isPreviewFlag: false,
	// 是否显示详情按钮
	isDetailFlag: false,
	// 是否显示编辑按钮-默认不显示
	isEditFlag: false,
	// 是否显示新增按钮-默认不显示
	isAddFlag: false,
	// 是否显示删除按钮-默认不显示
	isDeleteFlag: false,
	// 是否将空字符串替换成 “--”
	isReplaceSpaceFlag: false,
	// 表格宽度
	width: '100%',
	// 表格底部外边距
	tableMb: 20,
	// 针对纯文本表格设置表格行高
	lineHeightFlag: false,
	multipleDelete: {key: '批量删除', value: 'multipleDelete'},
	multipleSwitchOn: {key: '批量启用', value: 'multipleSwitchOn'},
	multipleSwitchOff: {key: '批量禁用', value: 'multipleSwitchOff'}
}

/**
 * 表格组件复选框操作方法
 * @param { object } row
 */
export const TABLE_DATA_SELECT_EVENT_FN = (rows: TableDataType[]) => {
	rows.forEach(item => {
		if(item.isSelect) item.isSelect = false
	})
}

/**
 * 复制文本
 * @param { String } txt 
 */
export const COPY_TEXT_FN = (txt: string) => {
	const message = '复制成功'
	if(navigator.clipboard && window.isSecureContext) {
		navigator.clipboard.writeText(txt).then(() => {
			ElMessage({
				type: 'success',
				message
			})
		})
	} else {
		const textArea = document.createElement('textarea')
		textArea.value = txt
		document.body.appendChild(textArea)
		textArea.focus()
		textArea.select()
		ElMessage({
			type: 'success',
			message
		})
		return new Promise((resolve, reject) => {
			document.execCommand('copy') ? resolve(message) : reject()
			textArea.remove()
		})
	}
}

/**
 * el-switch 开关按钮鉴权(不支持自定义指令，before-change绑定的事件不支持传参)
 * 适用直接写在页面上的 switch 开关按钮，仅通过 :before-change 绑定事件（无需参数）的 switch 开关按钮
 * :before-change="switchChangeFn"
 * import { vAuthFn } from '@/common/hooks'
 * const switchChangeFn = () => {
 * 		if(!vAuthFn()) return 
 * 		// ...... 
 * }
 */
export const vAuthFn = () => {
	const message = '对不起，当前用户没有操作权限，请联系管理员。'
	const loginCountdown = Utils.getStorage({
		storageName: 'LOGIN_COUNTDOWN',
		storageType: 'localStorage'
	})
	const isValidTime = loginCountdown > 1 ? true : false
	const isValidUserType = USER_TYPE_FN({userType: 'isAdministrator'})

	// true 放行点击事件， false 拦截事件
	if(isValidTime && isValidUserType) return true
	ElMessage.error(message)
	return false
}

/**
 * el-switch 开关按钮鉴权
 * :before-change 该方法不接收参数，返回一个promise或Boolean，用于绑定鉴权方法
 * @change 绑定逻辑事件
 * import { SWITCH_BEFORE_CHANGE_FN } from '@/common/hooks'
 * <el-switch v-model="xxx" :before-change="SWITCH_BEFORE_CHANGE_FN" @change="xxxFn" />
 */
export const SWITCH_BEFORE_CHANGE_FN  = () => vAuthFn() ? true : false

/**
 * 清除字符串前后的空格符
 * @param { string } str 
 * @returns str
 */
export const REMOVE_BLANK_SPACE_FN = (str: string) => str?.replace(/^\s*|\s*$/g, '')

/**
 * 比较两个对象的字符串内容是否一致
 * @param { object } oldData - 初始数据（参照）
 * @param { object } newData - 最新数据
 * @returns { boolean }
 */
export const IS_FORM_DATA_CHANGE_FN = (oldData: FormType, newData: FormType): boolean => JSON.stringify(oldData) === JSON.stringify(newData)

/**
 * json 格式化
 * @param {String / Object}		json
 * @param {Object}				options
 */
export const FORMAT_JSON_FOR_NOTES = (jsonStr: string) => JSON.stringify(JSON.parse(jsonStr), null, '\t')

/**
 * input / textarea 文本域 tab 缩进
 */
export const HANDLE_TAB = (event: Event): void => {
	event.preventDefault()
	const textarea = event.target as HTMLTextAreaElement
	const start = textarea.selectionStart
	const end = textarea.selectionEnd
	const value = textarea.value
	textarea.value = value.substring(0, start) + '\t' + value.substring(end)
	// 将光标位置调整到缩进后的位置
	textarea.selectionStart = textarea.selectionEnd = start + 1
}